package Thread;


import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Lambda表达式 -- >()->{}【接口/抽象类 -- 匿名内部类】
 *                       【集合遍历 -- 匿名内部类】
 *  Collection --- >List:存重复元素并且有序[保存数据结构一致]
 *                  Set:存无序并且不重复【保存数据结构一致】
 *                  Queue:队列结合业务
 * Map------------->HashMap:键值对存储
 *
 */
public class LambdaDemo {
    public void testList() {
        List<String> list = new ArrayList<>();
        list.add("白洋淀");
        list.add("正定古城");
        list.add("河头老街");
        list.add("白石山");
        //集合几种遍历方式:普通for,增强for,forEach方法
        for (String str : list) {
            System.out.println("增强for:" + str);
        }
        //支持forEach方法:遍历集合元素
// Consumer接口针对List集合提供接口:功能获取List集合元素
//accept()获取List集合的所有元素
        list.forEach(new Consumer<String>() {
            public void accept(String s) {
                System.out.println("consumer接口遍历方案:" + s);
            }
        });
        //支持forEach方法:遍历集合元素【Consumer 匿名内部类】
        //编写Lambda表达式写法
        list.forEach(s -> System.out.println("consumer接口遍历方案:" + s));


    }

    public void testMap() {
//创建Map集合:键值对
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "唐山");
        map.put(2, "石家庄");
        map.put(3, "秦皇岛");
        map.put(4, "邯郸");
        //遍历集合:普通for、增强for、forEach(BiConSummer接口 -- 匿名内部类
//键值对 -- >一组Entry对象
//BiConSummer接口 --- 获取每组Entry对象 --- accept()获取Entry对象
        map.forEach(new BiConsumer<Integer, String>() {
            public void accept(Integer integer, String s) {
                System.out.println("键:" + integer + "值:" + s);
            }
        });

//使用Lambda表达式
        map.forEach((i, s) -> System.out.println("lambda值:" + s));
    }

    /**
     * 1.使用Lambda表达式完成 Thread线程创建
     * 2.使用Lambda表达式完成 Runnable线程创建
     * 3.I0流 -- File类:listFile(FileFilter接口)[5行代码]
     * 目标:【io包下FilterAPI类】实现使用Lambda表达式完成
     * 4.I0流 -- Filele类:listFile(FileFilter接口)[2行代码]
     * 目标:【io包下FilterAPI类】实现使用Lambda表达式完成
     * 5.集合:改成lambda写法
     * 目标:【List包下ListAPI类下单元测试:testComparator()]
     * LambdaDemo类下 -- 完成作业
     *
     * @LambdaHomeWork1
     * @LambdaHomeWork2 ...
     * 提交11/8   中午12前
     **/
    public void LambdaHomeWork1() {
        //使用lambda表达式完成Thread线程创建
        ////Thread类Java定义线程类--具备启动start---
        // Thread类内嵌Runnable类--线程run运行
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                //System.out.println("给我学的呀，One楞One楞的");
            }
        });
        t1.start();

    }

    @Test
    public void LambdaHomework2() {
        //1.创建Runnable接口
        Runnable mr1 = () -> {
            for (int i = 0; i < 1000; i++) {
                System.out.println("时间不等人，但我等你~");
            }
        };
        //2.创建Thread线程类 --start()
        Thread t2 = new Thread(mr1);
        //3.启动线程
        t2.start();
    }

    @Test
    public void LambdaHomework3() {
        File file = new File("." + File.separator + "API");
        FileFilter my = (pathname) -> {
            return pathname.getName().startsWith("s");
        };
        File[] subs = file.listFiles(my);
        for (int i = 0; i < subs.length; i++) {
            System.out.println("所有的文件和文件夹的名：" + subs[i].getName());
        }
    }

    @Test
    public void LambdaHomework4() {
        for (File f : new File("." + File.separator + "API").listFiles((pathname) -> {
            return pathname.getName().startsWith("s");
        })) {
            System.out.println("遍历后过滤完成：" + f);
        }
    }
    @Test
    public void LambdaHomework5() {
            List<String> list = new ArrayList<>();
            list.add("汉字");
            list.add("字");
            list.add("测试");
            list.add("单元");
            // 使用Lambda表达式进行排序
            list.sort((o1, o2) -> o1.length() - o2.length());
            System.out.println("排序后集合：" + list);
        }
    }


